/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import Facade.Facade;
import GUI.tabelas.tabelaProdutos;
import Objetos.Compra;
import Objetos.Conta;
import Objetos.Dia;
import Objetos.Fornecedor;
import Objetos.Movimentacao;
import Objetos.Parcela;
import Objetos.Produto;
import Objetos.Usuario;
import Objetos.ValoresFixos;
import com.toedter.calendar.JDateChooser;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author celio
 */
public final class EntradaProdutos extends JPanel {

    JLabel formPag, fornecedor, nota, item, valorNota, valorPagar, parcelas, qtd, obs;
    public static JTextField tFornecedor, tDescFornecedor, tNota, tValorNota, tValorPagar, tParcelas, tItem, tDescItem, tQtd, tObs;
    JButton registrar, inserir, concluir, limpar;
    JComboBox tFormPag, tTipo;
    JTable produtos;
    DefaultTableModel dtm;
    Vector linhas, dados, cabecalho, condPag;
    Vector vetorParcela = null;
    Vector vetorProduto = null;
    JScrollPane scroller;
    Calendar data;
    JDateChooser dataPag;
    Produto produto;
    Facade fa;
    String tipos[] = {"","Avulso","Parcelas"};

    public EntradaProdutos(final Usuario usu) {

        final JLabel tela = new JLabel("... :::   Entrada de Produtos   ::: ...");
        tela.setBounds(400, 10, 500, 20);
        add(tela);

        data = Calendar.getInstance();
        dataPag = new JDateChooser();
        
        fornecedor = new JLabel("Fornecedor: ");
        item = new JLabel("Item: ");
        nota = new JLabel("Nota: ");
        valorNota = new JLabel("Valor da Nota: ");
        qtd = new JLabel("Quantidade: ");
        obs = new JLabel("Observação");
        formPag = new JLabel("Forma de Pagamento: ");
        valorPagar = new JLabel("Valor a Pagar: ");
        parcelas = new JLabel("Parcelas: ");

        tTipo = new JComboBox(tipos);
        fa = new Facade();
        tFormPag = new JComboBox(fa.todas_CondicaoePagamento(usu));

        tFornecedor = new JTextField(10);
        tDescFornecedor = new JTextField(45);
        tItem = new JTextField(10);
        tDescItem = new JTextField(40);
        tNota = new JTextField(10);
        tValorNota = new JTextField(10);
        tQtd = new JTextField(10);
        tObs = new JTextField(40);
        tValorPagar = new JTextField(10);
        tParcelas = new JTextField(2);

        registrar = new JButton("Registrar");
        inserir = new JButton("Inserir");
        concluir = new JButton("Concluir");
        limpar = new JButton("Limpar");

        cabecalho = new Vector();
        linhas = new Vector();
        dados = new Vector();
        vetorProduto = new Vector();
        vetorParcela = new Vector();

        cabecalho.addElement("Cód");
        cabecalho.addElement("Descrição");
        cabecalho.addElement("Quantidade");

        produtos = new JTable(linhas, cabecalho);
        produtos.setFont(new Font("Times New Roman", Font.BOLD, 14));
        dtm = (DefaultTableModel) produtos.getModel();
        scroller = new JScrollPane(produtos, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        produtos.getColumnModel().getColumn(0).setPreferredWidth(100);
        produtos.getColumnModel().getColumn(1).setPreferredWidth(300);
        produtos.getColumnModel().getColumn(2).setPreferredWidth(100);

        nota.setBounds(10, 30, 100, 20);
        tNota.setBounds(120, 30, 100, 20);

        valorNota.setBounds(10, 60, 100, 20);
        tValorNota.setBounds(120, 60, 80, 20);

        item.setBounds(10, 90, 180, 20);
        tItem.setBounds(120, 90, 20, 20);
        tDescItem.setBounds(150, 90, 200, 20);

        fornecedor.setBounds(10, 120, 180, 20);
        tFornecedor.setBounds(120, 120, 20, 20);
        tDescFornecedor.setBounds(150, 120, 200, 20);
        
        qtd.setBounds(10, 150, 100, 20);
        tQtd.setBounds(120, 150, 50, 20);

        obs.setBounds(10, 180, 100, 20);
        tObs.setBounds(120, 180, 200, 20);

        formPag.setBounds(400, 390, 150, 20);
        tFormPag.setBounds(530, 390, 100, 20);

        valorPagar.setBounds(400, 360, 100, 20);
        tValorPagar.setBounds(490, 360, 80, 20);
        
        tTipo.setBounds(630, 360, 100, 20);

        dataPag.setBounds(630, 390, 100, 20);
        
        parcelas.setBounds(630, 390, 100, 20);
        tParcelas.setBounds(690, 390, 50, 20);

        inserir.setBounds(20, 230, 100, 20);
        registrar.setBounds(250, 330, 100, 20);
        limpar.setBounds(150, 230, 100, 20);
        concluir.setBounds(900, 350, 100, 20);

        scroller.setBounds(360, 50, 720, 300);
        add(scroller);

        add(item);
        add(tItem);
        add(tDescItem);
        tDescItem.setEditable(false);

        add(fornecedor);
        add(tFornecedor);
        add(tDescFornecedor);
        tFornecedor.setEditable(false);
        tDescFornecedor.setEditable(false);

        add(nota);
        add(tNota);

        add(valorNota);
        add(tValorNota);

        add(qtd);
        add(tQtd);

        add(obs);
        add(tObs);

        add(valorPagar);
        add(tValorPagar);
        
        add(tTipo);
        add(dataPag);
        
        add(formPag);
        add(tFormPag);

        add(parcelas);
        add(tParcelas);

        add(registrar);
        add(inserir);
        add(limpar);
        add(concluir);

        concluir.setVisible(false);
        valorPagar.setVisible(false);
        tValorPagar.setVisible(false);
        tValorPagar.setEditable(false);
        parcelas.setVisible(false);
        tParcelas.setVisible(false);
        tFormPag.setVisible(false);
        formPag.setVisible(false);
        tTipo.setVisible(false);
        dataPag.setVisible(false);

            // atualizaTabela();
        tItem.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
               // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void keyPressed(KeyEvent e) {
            
                if(e.getKeyCode()==118){
                    
                    tabelaProdutos tp = new tabelaProdutos(usu);
                    
                }
                
            }

            @Override
            public void keyReleased(KeyEvent e) {
               // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        });
        
        tItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                produto = fa.procurar_Produto(tItem.getText(),usu);
                if (produto == null) {
                    JOptionPane.showMessageDialog(null, "Código de produto não cadastrado!!!");
                } else {
                    tDescItem.setText(produto.getDescProduto());
                    tFornecedor.setText(produto.getFornecedor());
                    tDescFornecedor.setText(fa.procurar_Fornecedor(produto.getFornecedor(), usu).getNomeFornecedor());
                }
            }
        });

        limpar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
            
                tFornecedor.setText("");
                tDescFornecedor.setText("");
                tNota.setText("");
                tValorNota.setText("");
                tItem.setText("");
                tDescItem.setText("");
                tQtd.setText("");
                tObs.setText("");
                tValorPagar.setText("");
                concluir.setVisible(false);
                valorPagar.setVisible(false);
                tValorPagar.setVisible(false);
                tValorPagar.setEditable(false);
                parcelas.setVisible(false);
                tParcelas.setVisible(false);
                tFormPag.setVisible(false);
                formPag.setVisible(false);
                tTipo.setVisible(false);
                dataPag.setVisible(false);
                int rows = produtos.getRowCount();
                for (int a = 0; a <= rows; a++) {
                        while (dtm.getRowCount() != 0) {
                            dtm.removeRow(0);
                        }
                    }
                
            }
        });
        tFornecedor.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                Fornecedor f = fa.procurar_Fornecedor(tFornecedor.getText(),usu);
                if (f == null) {
                    JOptionPane.showMessageDialog(null, "Código de fornecedor não cadastrado!!!");
                } else {

                    tDescFornecedor.setText(f.getNomeFornecedor());

                }

            }
        });

        registrar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                concluir.setVisible(true);
                valorPagar.setVisible(true);
                tValorPagar.setVisible(true);
                tFormPag.setVisible(true);
                formPag.setVisible(true);

                tValorPagar.setText(tValorNota.getText());

            }
        });
        
        tTipo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
            
                if(tTipo.getSelectedIndex()==1){
                    
                    parcelas.setVisible(false);
                    tParcelas.setVisible(false);
                    tParcelas.setEditable(false);
                    tParcelas.setText("1");
                    dataPag.setVisible(true);
                    
                }else
                    if(tTipo.getSelectedIndex()==2){
                        
                        parcelas.setVisible(true);
                        tParcelas.setVisible(true);
                        tParcelas.setEditable(true);
                        tParcelas.setText("");
                        dataPag.setVisible(false);
                        
                    }
                
            }
        });

        concluir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                

                Compra compra = new Compra();
                compra.setCodFornecedor(tFornecedor.getText());
                compra.setNota(tNota.getText());
                compra.setData(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                try {
                    compra.setValor(Funcoes.funcoes.formatoParaInserir(tValorNota.getText()));
                } catch (ParseException ex) {
                    Logger.getLogger(EntradaProdutos.class.getName()).log(Level.SEVERE, null, ex);
                }

                fa.inserir_Compra(compra,usu);
                compra.setCodCompra(fa.pegarUltima_Compra(usu));
                for (int a = 0; a < vetorProduto.size(); a++) {

                    Produto produtoComprado = (Produto) vetorProduto.elementAt(a);
                    fa.comprar_Produto(produtoComprado, compra, Integer.parseInt(produtos.getValueAt(a, 2).toString()),usu);
                    Produto proSaldo = fa.procurar_Produto(produtoComprado.getCodProduto(),usu);
                    int antes = Integer.parseInt(proSaldo.getQtd());
                    int depois = Integer.parseInt(produtos.getValueAt(a, 2).toString());
                    int qtd = antes + depois;

                    fa.alterarSaldo_Produto(produtoComprado, qtd,usu);
                }

                int tParc = Integer.parseInt(tParcelas.getText());
                Double total = 0.0;
                try {
                    total = Double.parseDouble(Funcoes.funcoes.formatoParaInserir(tValorPagar.getText()));
                } catch (ParseException ex) {
                    Logger.getLogger(EntradaProdutos.class.getName()).log(Level.SEVERE, null, ex);
                }
                for (int a = 1; a <= tParc; a++) {

                    if (tFormPag.getSelectedIndex() == 1) {

                        
                        Movimentacao mov = new Movimentacao();
                        fa = new Facade();
                        Dia dia = fa.verificarUltimoDia_Dia(usu);

                        mov.setTipo("Compra");
                        mov.setDescricao("Pagamento da compra: " + compra.getCodCompra());

                        mov.setData(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                        mov.setIddia(dia.getCodDia());
                        try {
                            mov.setValor(Funcoes.funcoes.formatoParaInserir("-" + tValorPagar.getText()));
                        } catch (ParseException ex) {
                            Logger.getLogger(EntradaProdutos.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        fa.inserir_Movimentacao(mov,usu);
                        Dia alteraSaldo = new Dia();
                        alteraSaldo.setCodDia(dia.getCodDia());
                        double saldoAntes = Double.parseDouble(dia.getSaldo_atual());
                        double valor = 0.0;
                        try {
                            valor = Double.parseDouble(Funcoes.funcoes.formatoParaInserir(tValorPagar.getText()));
                        } catch (ParseException ex) {
                            Logger.getLogger(EntradaProdutos.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        String saldoAtual = Double.toString(saldoAntes - valor);
                        alteraSaldo.setSaldo_atual(saldoAtual);

                        fa.alterarSaldo_Dia(alteraSaldo,usu);

                        tFornecedor.setText("");
                        tDescFornecedor.setText("");
                        tNota.setText("");
                        tValorNota.setText("");
                        tValorPagar.setText("");
                        tItem.setText("");
                        tDescItem.setText("");
                        tObs.setText("");
                        tQtd.setText("");
                        tFormPag.setSelectedIndex(0);
                        tParcelas.setText("");

                    } else {
                        if(tTipo.getSelectedIndex()==2){
                        Parcela parcelasPedido = new Parcela();
                        data.add(Calendar.MONTH, 1);
                        parcelasPedido.setCod_pedido(compra.getCodCompra());
                        parcelasPedido.setCod_cliente(compra.getCodFornecedor());
                        parcelasPedido.setCod_condicao(pegaCodCondicao(tFormPag.getSelectedItem().toString()));
                        parcelasPedido.setValor(Double.toString(total / tParc));
                        parcelasPedido.setDescricao("Parcela: " + a + "/" + tParc + " da compra: " + compra.getCodCompra());
                        parcelasPedido.setData_pagamento(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                        parcelasPedido.setTipo(ValoresFixos.TipoParcela.saida.getTipo());
                        vetorParcela.add(parcelasPedido);
                        }else{
                            if(tTipo.getSelectedIndex()==1){
                               
                                Parcela parcelasPedido = new Parcela();
                                data.add(Calendar.MONTH, 1);
                                parcelasPedido.setCod_pedido(compra.getCodCompra());
                                parcelasPedido.setCod_cliente(compra.getCodFornecedor());
                                parcelasPedido.setCod_condicao(pegaCodCondicao(tFormPag.getSelectedItem().toString()));
                                parcelasPedido.setValor(Double.toString(total / tParc));
                                parcelasPedido.setDescricao("Parcela: " + a + "/" + tParc + " da compra: " + compra.getCodCompra());
                                parcelasPedido.setData_pagamento(Funcoes.funcoes.paraInserirData(dataPag.getDate().toLocaleString().substring(0, 10)));
                                parcelasPedido.setTipo(ValoresFixos.TipoParcela.saida.getTipo());
                                vetorParcela.add(parcelasPedido);
                                
                            }
                        }
                        
                   }
                }
                Calendar data_Hoje = Calendar.getInstance();
                String dataHoje = data_Hoje.getTime().toLocaleString().substring(0, 10);
                for (int a = 0; a < vetorParcela.size(); a++) {

                    Parcela parcelaInserir = (Parcela) vetorParcela.elementAt(a);
                    fa.inserirParcela_Parcela(parcelaInserir,usu);
                    

                    Conta conta = new Conta();
                    conta.setDescricao(parcelaInserir.getDescricao());
                    conta.setValor(parcelaInserir.getValor());
                    conta.setDataInclusao(Funcoes.funcoes.paraInserirData(dataHoje));
                    conta.setDataExecucao(parcelaInserir.getData_pagamento());
                    conta.setTipo(ValoresFixos.TipoConta.saida.getTipo());
                    conta.setStatus(ValoresFixos.StatusConta.aberta.getStatus());
                    fa.adicionar_Conta(conta, usu);

                    tFornecedor.setText("");
                    tDescFornecedor.setText("");
                    tNota.setText("");
                    tValorNota.setText("");
                    tValorPagar.setText("");
                    tItem.setText("");
                    tDescItem.setText("");
                    tObs.setText("");
                    tQtd.setText("");
                    tFormPag.setSelectedIndex(0);
                    tParcelas.setText("");

                }
            }

        });

        tFormPag.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                if (tFormPag.getSelectedIndex() == 1) {

                    tTipo.setVisible(false);
                    tParcelas.setEditable(false);
                    tParcelas.setText("1");

                } else {

                   tTipo.setVisible(true);

                }

            }
        });

        inserir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                produto = fa.procurar_Produto(tItem.getText(), usu);
                dtm.addRow(new Object[]{produto.getCodProduto(), produto.getDescProduto(), tQtd.getText()});
                vetorProduto.add(produto);

                tItem.setText("");
                tDescItem.setText("");
                tObs.setText("");
                tQtd.setText("");

            }
        });

        setLayout(null);
        setBackground(Color.LIGHT_GRAY);
        setBorder(BorderFactory.createBevelBorder(1, Color.DARK_GRAY, Color.DARK_GRAY));
        setSize(800, 800);
        setVisible(true);
        revalidate();
        repaint();
    }

    public void atualizaTabela(Usuario usu) {

        try {
            remove(scroller);

        } catch (NullPointerException e) {
        }
        fa = new Facade();
        produtos = fa.consultaTodos_Produto(usu);
        scroller = new JScrollPane(produtos, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scroller.setBounds(350, 50, 720, 400);
        add(scroller);
    }

    private String pegaCodCondicao(String condicao) {

        String retorno = null;
        for (int a = 0; a <= condicao.length(); a++) {

            if (condicao.charAt(a) != '-') {

                retorno = condicao.substring(0, a + 1);
                return retorno;
            } else {
                return null;
            }

        }
        return null;

    }

}
